<?php
/**
 * JoiGallery - image gallery component for Joostina
 *
 * Core Classes
 *
 * @version 1.0 alpha 12
 * @package JoiGallery
 * @filename joigallery.class.php
 * @author JoostinaTeam
 * @copyright (C) 2008-2009 Joostina Team
 * @license see license.txt
 *
 **/

// запрет прямого доступа
defined('_VALID_MOS') or die();

$mainframe->addLib('dbconfig');

define('_JOI_GALLERY_VERSION', '1.0 alpha 12');

define('_JOI_GALLERY_ADMIN_BASE', JPATH_BASE.DS.'administrator'.DS.'components'.DS.'com_joigallery');
define('_JOI_GALLERY_ADMIN_SITE', JPATH_SITE.'/administrator/components/com_joigallery');
define('_JOI_GALLERY_FRONT_BASE', JPATH_BASE.DS.'components'.DS.'com_joigallery');
define('_JOI_GALLERY_FRONT_SITE', JPATH_SITE.'/components/com_joigallery');

require_once (_JOI_GALLERY_FRONT_BASE.'/lib/image.class.php');
if(!defined('JOIRIGHTS')) {
    require_once (_JOI_GALLERY_FRONT_BASE.'/lib/joiRights.class.php');
}
if(!defined('JOIEXTRAFIELDS')) {
    require_once (_JOI_GALLERY_FRONT_BASE.'/lib/joiExtraFields.class.php');
}
if(!defined('JOITEMPLATES')) {
    require_once (_JOI_GALLERY_FRONT_BASE.'/lib/joiTemplates.class.php');
}
if(!defined('JOIPLUGINS')) {
    require_once (_JOI_GALLERY_FRONT_BASE.'/lib/joiPlugins.class.php');
}
if(!defined('JOITOOLS')) {
    require_once (_JOI_GALLERY_FRONT_BASE.'/lib/joiTools.class.php');
}
if(!defined('JOITAGS') && is_file($joitags_file = JPATH_BASE.'/components/com_joitags/joitags.class.php')) {
    require_once ($joitags_file);
}

//Подключаем языковой файл 
if (file_exists($lang_file = _JOI_GALLERY_FRONT_BASE.'/language/'.$mainframe->getCfg('lang').'/language.php'))
     $lang_file = $lang_file;
else $lang_file = _JOI_GALLERY_FRONT_BASE.'/language/english/language.php';

require_once ($lang_file);

//Категория с таким названием уже существует
defined('_CATEGORY_ALREADY_EXISTS') or define('_CATEGORY_ALREADY_EXISTS',_C_JOIGALLERY_MSG_CATEGORY_ALREADY_EXISTS);

//Необходимо указать название категории
defined('_ENTER_CATEGORY_NAME') or define('_ENTER_CATEGORY_NAME',_C_JOIGALLERY_MSG_CATEGORY_NO_NAME);

//Необходимо указать название категории
defined('_ENTER_CATEGORY_TITLE') or define('_ENTER_CATEGORY_TITLE',_C_JOIGALLERY_MSG_CATEGORY_NO_TITLE);

class joiGalleryPhoto extends mosDBTable {
    
    /** @var int **/
    var $id = null;
    /** @var int **/
    var $cid = null;
    /** @var string **/
    var $name = null;
    /** @var int **/
    var $user_id = null;
    /** @var datetime */
    var $created = null;
    /** @var text description **/
    var $description = null;
    /** @var string path **/
    var $path = null;
    /** @var string meta_title **/
    var $meta_title = null;
    /** @var string meta_desc **/
    var $meta_desc = null;
    /** @var string meta_kw **/
    var $meta_kw = null;
    /** @var boolean default **/
    var $default = null;
    /** @var int ordering **/
    var $ordering = null;
    /** @var tinyint state **/
    var $state = null;

    function joiGalleryPhoto(&$db) {
        $this->mosDBTable('#__joigallery', 'id', $db);
    }

    function clean_default($cid) {

        $query = 'UPDATE #__joigallery SET `default` = 0 WHERE cid = ' . (int)$cid;
        $this->_db->setQuery($query);
        return $this->_db->query();
    }

    function get_img_atribs($row, $config) {
        $mainframe = &mosMainFrame::getInstance();

        $file_path = JPATH_BASE.$config->original_path.'/'.$row->path;
        $file_path = file_exists($file_path) ? $file_path : JPATH_BASE.'/images/noimage.jpg';
        $curr = @getimagesize($file_path);
        $row->width = $curr[0];
        $row->height = $curr[1];
        $row->size = round(filesize($file_path) / 1024);

        return $row;
    }

    function get_next($row, $params, $count = 1) {
        
        $and = 'ordering > '.$row->ordering;
        if($params->images_sort!=='ordering'){
            $and = 'id > '.$row->id;
        }
        
        $order = $params->images_sort;
        if($params->images_sort=='id DESC'){
            $order = 'id ASC ';
        }
        
        $query = 'SELECT id, ordering,  description, path, cid
                  FROM #__joigallery
                  WHERE cid = '.(int)$row->cid.' AND state = 1 AND '.$and.'
                  ORDER BY '.$order.' LIMIT '.$count;

        $this->_db->setQuery( $query );
        return $this->_db->loadObjectList();

    }

    function get_prev($row, $params, $count = 1) {
    
        $and = 'ordering < '.(int)$row->ordering;
        if($params->images_sort!=='ordering')
            $and = 'id < '.(int)$row->id;

        if ($params->images_sort=='ordering')
             $order = $params->images_sort.' DESC';
        
        if ($params->images_sort=='id DESC')
             $order = 'id ASC ';

        $query = 'SELECT id, ordering, description, path, cid 
                  FROM #__joigallery
                  WHERE cid = '.(int)$row->cid.' AND state = 1 AND '.$and.'
                  ORDER BY '.$order.' LIMIT '.$count;

        $this->_db->setQuery( $query );
        return $this->_db->loadObjectList();
    }

    function get_count_photos($cid, $params = null, $subcats = null) {
        global $my;
        
        $cid = (int)$cid;
        if($subcats){
            foreach($subcats as $subcat){
                $cid .= ' OR cid = '.(int)$subcat->id;    
            }
        }

        $query = 'SELECT COUNT(*) FROM #__joigallery
		WHERE cid = '.$cid.' ';

        if ($my->gid != 2) {
            $query .= 'AND state = 1 ';
        }

        $query .= 'ORDER BY ordering';

        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }

    function load_photos($cid, $params = null, $subcats = null, $hide_default = null) {
        global $my;
        
        $cid = (int)$cid;
        		
		if($subcats){
            foreach($subcats as $subcat){
                $cid .= ' OR cid = '.(int)$subcat->id;    
            }
        }
		
        $query = 'SELECT * FROM #__joigallery
                  WHERE cid = ' .$cid . ' ';
	
		if ($my->gid != 2) {
            $query .= 'AND state = 1 ';
        }

        if ($hide_default) {// Скрывать эскизы категорий
            $query .= 'AND `default` = 0 ';
        }		

        $query .= 'ORDER BY '.$params->images_sort;
		//echo '<pre>';print_r($query);echo '</pre>';//Проверка запроса

        $this->_db->setQuery($query, $params->_limitstart, $params->_limit); 
        return $this->_db->loadObjectList();
    }
    
    function get_count_photos_with_subcats($cid) {
        global $my;

        $query = 'SELECT COUNT(*) FROM #__joigallery
		WHERE cid = ' . (int)$cid . ' ';

        if ($my->gid != 2) {
            $query .= 'AND state = 1 ';
        }

        $query .= 'ORDER BY ordering';

        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }

    function load_photos_with_subcats($cid, $params) {
        global $my;

        $query = 'SELECT * FROM #__joigallery
		WHERE cid = ' . (int)$cid . ' ';

        if ($my->gid != 2) {
            $query .= 'AND state = 1 ';
        }

        $query .= 'ORDER BY '.$params->images_sort;

        $this->_db->setQuery($query, $params->_limitstart, $params->_limit);
        return $this->_db->loadObjectList();
    }

    function get_count_photos_admin($cid) {

        $where = array();
        if($cid > 0) {
            $where[] = 'g.cid = ' . $cid;
        }

        $query = "SELECT COUNT(1) FROM #__joigallery g LEFT JOIN #__categories c ON g.cid = c.id ";
        if(sizeof($where) > 0) {
            $query .= "WHERE ".implode(" AND ", $where);
        }
        $query .= " ORDER BY cid, g.ordering";

        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }

    function load_photos_admin($cid, $limitstart, $limit) {

        $where = array();
        if($cid > 0) {
            $where[] = 'g.cid = ' . $cid;
        }

        $query = "SELECT g.*, c.title AS category FROM #__joigallery g LEFT JOIN #__categories c ON g.cid = c.id ";
        if(sizeof($where) > 0) {
            $query .= "WHERE " . implode(" AND ", $where);
        }
        // Неопубликованные объекты располагаем внизу списка (state DESC)
        $query .= " ORDER BY state DESC, cid, g.ordering";

        $this->_db->setQuery($query, $limitstart, $limit);
        return $this->_db->loadObjectList();
    }

    /**
     *	Данные изображения по ID
     *	@return array
     */
    function load_photos_by_id($id = null) {

        if (!$id) return false;

        $database = &database::getInstance();
        
        $query = "SELECT *
                  FROM #__joigallery
                  WHERE id IN ( ".$id." )
                  ORDER BY id, name";
        $database->setQuery($query);

        return $database->loadObjectList();
    }
	

    function check_photos_by_cat($cid) {

        $query = "SELECT COUNT(1) FROM #__joigallery WHERE cid = ".(int)$cid;
        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }

    function check_subcats_by_cat($cid) {

        $query = "SELECT COUNT(1) FROM #__categories WHERE parent_id = $cid";
        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }


    /**
    * Возвращает значение указанного поля ($field) из #__categories
    * по ID изображения
    *
    * @param int $id
    * @param string $field, default 'title'
    * @return string
    **/
    function get_cat_field_by_photo($id=null , $field='title') {

        if (!$id) return false;

        $id = (int)$id;

        $query = "SELECT c.$field
                  FROM  #__categories AS c
                  LEFT JOIN #__joigallery AS g ON c.id = g.cid
                  WHERE g.id = $id";

        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }

    function remove_images($row, $config) {
        $mainframe = &mosMainFrame::getInstance();

        $a_path = JPATH_BASE;
        $dirs = array($config->image_path, $config->thumbnail_path, $config->original_path);

        foreach ($dirs as $dir) {
            $img = $a_path . $dir . DS . $row->path;
            unlink($img);
            //if (!unlink($img)) {
            //return joiGalleryError::error('Failed to remove image: ' . $img);
            //}

        }
    }
    
    function check_main_photo($cat) {
        
        $query = "SELECT COUNT(id) FROM #__joigallery WHERE default = 1 AND cid = ".$cat;
        $this->_db->setQuery($query);
        if(!$this->_db->loadResult()){
            $query = "SELECT MAX(id) FROM #__joigallery WHERE state = 1 AND cid = ".$cat;
            $this->_db->setQuery($query);
            $max = $this->_db->loadResult();
            
            $query = 'UPDATE #__joigallery SET `default` = 1 WHERE id = '.$max;
            $this->_db->setQuery($query);
            return $this->_db->query();            
        }        
    }

}

class joiGalleryRights extends joiRights {

    var $view_cat = null;
    var $view_unpub_cat = null;
    var $view_photo = null;
    var $view_unpub_photo = null;
    var $add_photo_single = null;
    var $add_photo_archive = null;
    var $edit_photo = null;
    var $edit_own_photo = null;
    var $del_photo = null;
    var $del_own_photo = null;
    var $add_cat = null;
    var $edit_cat = null;
    var $edit_own_cat = null;
    var $del_cat = null;
    var $del_own_cat = null;
    var $no_premoderate = null;
    var $set_state = null;
    var $set_state_own = null;
    var $main_photo = null;
    var $main_photo_own = null;

    function joiGalleryRights($config_rights) {

        $rights_label = array(
                'view_cat' => 'Просмотр категории',
                'view_unpub_cat' => 'Просмотр неопубликованной категории',
                'view_photo' => 'Просмотр страницы фото',
                'view_unpub_photo' => 'Просмотр неопубликованных фото',
                'add_photo_single' => 'Загрузка фото',
                'add_photo_archive' => 'Загрузка архивом',
                'edit_photo' => 'Редактирование любого фото',
                'edit_own_photo' => 'Редактирование своих фото',
                'del_photo' => 'Удаление любого фото',
                'del_own_photo' => 'Удаление своих фото',
                'add_cat' => 'Добавление категорий',
                'edit_cat' => 'Редактирование любой категории',
                'edit_own_cat' => 'Редактирование своих категорий',
                'del_cat' => 'Удаление любой категории',
                'del_own_cat' => 'Удаление своей категории',
                'no_premoderate' => 'Публикация без премодерации',
                'set_state' => 'Смена статуса любой публикации',
                'set_state_own' => 'Смена статуса своей публикации',
                'main_photo' => 'Назначение главного фото в любой категории',
                'main_photo_own' => 'Назначение главного фото в своей категории'
        );

        $error_messages = array(
                'view_cat' => 'Извините, вы не можете просматривать эту категорию',
                'view_unpub_cat' => 'Категория не существует или не опубликована',
                'view_photo' => 'Извините, у вас нет доступа к этому изображению',
                'view_unpub_photo' => 'Изображение не существует или не опубликовано',
                'add_photo_single' => 'Извините, вы не можете загружать фото',
                'add_photo_archive' => 'Извините, вы не можете загружать фото',
                'edit_photo' => 'Извините, у вас нет доступа к редактированию фото',
                'edit_own_photo' => 'Извините, у вас нет доступа к редактированию фото',
                'del_photo' => 'Извините, вы не можете удалять изображения',
                'del_own_photo' => 'Извините, вы не можете удалять изображения',
                'add_cat' => 'Извините, вы не можете добавлять категории',
                'edit_cat' => 'Извините, вы не можете редактировать категории',
                'edit_own_cat' => 'Извините, вы не можете редактировать категории',
                'del_cat' => 'Извините, вы не можете удалять категории',
                'del_own_cat' => 'Извините, вы не можете удалять категории',
                'no_premoderate' => 'Изображение будет опубликовано после проверки модератором',
                'set_state' => 'Извините, вы не можете опубликовывать изображения',
                'set_state_own' => 'Извините, вы не можете опубликовывать свои изображения',
                'main_photo' => 'Извините, вы не можете назначать эскизы категорий',
                'main_photo_own' => 'Извините, вы не можете назначать эскизы категорий'
        );

        $this->joiRights($config_rights, $rights_label, $error_messages);
        return true;
    }
}

class joiGalleryConfig extends dbConfig {

    var $upscale_middle = 0;// Увеличивать ли создаваемые изображения до указанного размера
    var $original_path = '/images/joigallery/originals';
    var $image_path = '/images/joigallery/resized';
    var $thumbnail_path = '/images/joigallery/thumbs';
    var $max_height = '400';
    var $max_width = '500';
    var $image_crop = 0;
    var $thumbnail_height = '100';
    var $thumbnail_width = '100';
    var $thumb_crop = 1;
    var $allow_formats = "image/pjpeg,image/jpeg,image/jpg,image/png,image/x-png,image/gif,image/bmp";

    var $template_dir = 0;

    
	//Отображение миниатюр эскизов в списке категорий
    var $adm_cat_list_thumbs = 1;
    var $adm_cat_list_thumbs_max_width = '32';
    var $adm_cat_list_thumbs_max_height = '32';
    var $adm_cat_list_thumbs_source = 'thumbnail_path';
    var $adm_cat_list_thumbs_fb = 1;
    var $adm_cat_list_thumbs_fb_group = 'all';
	
	//Отображение миниатюр в списке изображений
    var $adm_img_list_thumbs = 1;
    var $adm_img_list_thumbs_max_width = '40';
    var $adm_img_list_thumbs_max_height = '40';
    var $adm_img_list_thumbs_source = 'thumbnail_path';
    var $adm_img_list_thumbs_fb = 1;
    var $adm_img_list_thumbs_fb_group = 'cat';
	
	//Отображение миниатюры на странице редактирования изображения
    var $adm_img_form_thumbs = 1;
    var $adm_img_form_thumbs_max_width = '100';
    var $adm_img_form_thumbs_max_height = '100';
    var $adm_img_form_thumbs_source = 'thumbnail_path';
    var $adm_img_form_thumbs_fb = 1;
		
    //Миниатюр на странице
    var $thumbnails_limit = '10';

	//Шаблон просмотра категории
    var $template_cat = 'default.php';
	//Шаблон редактирования категории
    var $template_edit_cat = 'default.php';
	
	//Стиль просмотра категории
    var $template_cat_css = 'default.css';
	//Стиль редактирования категории
    var $template_edit_cat_css = 'default.css'; 
	
    var $images_sort = 'ordering';
    //Заголовок
    var $template_cat_title = 1;
    //Путь
    var $cat_pathway = 1;
    var $cat_add_edit_pathway = 1;


    //Заголовок добавления/ред. категории
    var $cat_add_edit_title = 1;
    
    /** Просмотр категории - вывод подкатегорий */
    var $cat_view_subcats = 0;
    
    /** Просмотр категории - вывод изображений */
    var $cat_view_items = 0;

    //Заголовок подкатегорий
    var $template_cat_subcats_title = 'Подкатегории';
	
    //Описание подкатегорий
    var $template_cat_subcats_desc = 'Описание подкатегорий';

    /** Просмотр категории - картинки к подкатегориям */
    var $cat_view_subcats_thumb = 1;

    //Просмотр категории - Скрывать эскизы категории
    var $template_cat_hide_default = 0;
	
	//Просмотр категории - FancyBox
    var $template_cat_use_lightbox = 0;

    //Случайное изображение из подкатегории или назначенное
    var $template_cat_subcats_photo_random = 0;
    
    /** Просмотр категории - показывать названия подкатегорий */
    var $cat_name_cat_view = 1;
    
    /** Просмотр категории - показывать описание подкатегорий */
    var $cat_desc_cat_view = 0;

    /** Просмотр категории - названия изображений */
    var $image_name_cat_view = 1;
	
    /** Просмотр категории - описания изображений */
    var $image_desc_cat_view = 0;
	
     /** Просмотр категории - количество изображений */
    var $template_cat_subcats_photo_count = 1;
	
    /** Просмотр категории - рейтинг изображений */
    var $image_rate_cat_view = 1;
	
    /** Просмотр изображения - pathway */
    var $image_pathway = 1;
	
    /** Просмотр изображения - название */
    var $image_name_photo_view = 1;
	
    /** Просмотр изображения - описание */
    var $image_desc_photo_view = 1;
    
	/** Просмотр изображения - шаблон */
	var $template_photo = 'default.php';
	
	/** Просмотр изображения - стиль */
	var $template_item_css = 'default.css';	


	/** ДОБАВЛЕНИЕ/РЕДАКТИРОВАНИЕ ИЗОБРАЖЕНИЙ */
    
	/** Добавление изображений - шаблон */
	var $template_add_photo = 'default.php';
	
    /** Добавление изображений - стиль */
	var $template_add_item_css = 'default.css';	
	
	/** Редактирование изображения - шаблон */
	var $template_edit_photo = 'default.php';
    /** Редактирование изображения - стиль */
	var $template_edit_item_css = 'default.css';
	
    /** Просмотр изображения - рейтинг изображения */
    var $image_rate_photo_view = 1;
    /** Просмотр изображения - информация */
    var $image_info_photo_view = 1;
    /** Просмотр изображения - автор */
    var $image_author_photo_view = 1;
    /** Просмотр изображения - дата создания */
    var $image_created_photo_view = 1;
    /** Просмотр изображения - навигация по изображениям */
    var $photo_navigation = 1;
    /** Просмотр изображения - лайтбокс */
    var $use_lightbox = 1;
    /** Просмотр изображения - комментарии */
    var $comments = 0;
    /** Просмотр изображения - bb-code */
    var $image_bb_code = 1;
    /** Просмотр изображения - хтмл-код */
    var $image_html_code = 1;
    /** Просмотр категории - комментарии к фоткам */
    var $comments_cat_view = 0;


    /** ГЛАВНАЯ СТРАНИЦА */
    
    //Заголовок
    var $template_main_title = 'Главная страница галереи';
    //Верхний текст
    var $template_main_txt_top = 'Верхний текст';
    //Нижний текст
    var $template_main_txt_bottom = 'Нижний текст';
    //Шаблон
    var $template_main = 'default.php';
	//Стиль
    var $template_main_css = 'default.css';
    //Путь
    var $template_main_pathway = 0;
    //Метаданные
    var $template_main_meta_title = '';
    var $template_main_meta_kw = '';
    var $template_main_meta_desc = '';

    //Вывод подкатегорий
    var $template_main_view_subcats = 1;
    //Вывод изображений
    var $template_main_view_items = 2;
    //Заголовок подкатегорий
    var $template_main_subcats_title = 'Категории';
    //Описание подкатегорий
    var $template_main_subcats_desc = 'Описание категорий на главной';
    //Случайное изображение из категории или назначенное
    var $template_main_subcats_photo_random = 0;
    //Изображения подкатегории
    var $template_main_view_subcats_thumb = 1;
    //Названия категории
    var $template_main_name_cat_view = 1;
    //Количество изображений в категории
    var $template_main_img_count_cat_view = 1;
    //Описания категории
    var $template_main_desc_cat_view = 1;

    //Заголовок изображений
    var $template_main_photos_title = 'Изображения';
    //Описание изображений
    var $template_main_photos_desc = 'Описание изображений';
    //Показывать изображение
    var $template_main_view_photo_thumb = 1;

    //Просмотр изображения - FancyBox
    var $template_main_use_lightbox = 0;
	
	//Скрывать эскизы категорий
	var $template_main_hide_default = 0;

    //Название изображения 
    var $template_main_photo_name = 1;
    //Описание изображений 
    var $template_main_photo_desc = 0;
    //Рейтинг изображений
    var $template_main_photo_rate = 0;
    //Комментарии к изображениям
    var $template_main_photo_comments = 0;

    //Загрузка изображений
    var $add_image_pagetitle = 'Загрузка изображений';
    var $add_image_pubunpub = 1;
    var $add_image_default = 1;
    var $add_image_fname = 1;
    var $add_image_fdesc = 1;
    var $add_image_fdesc_wwyg = 1;    
    var $add_image_pathway = 1;

    //Редактирование изображения
    var $edit_image_cat = 1;
    var $edit_image_pagetitle = 'Редактирование изображения';
    var $edit_image_pubunpub = 1;
    var $edit_image_default = 1;
    var $edit_image_fname = 1;
    var $edit_image_fdesc = 1;
    var $edit_image_fdesc_wwyg = 1;
    var $edit_image_pathway = 1;
    
    var $extrafields_add_photo = 0;
    var $extrafields_edit_photo = 0;
    var $extrafields_auto_js = 1;
    
    var $image_watermark = 0;
    var $thumb_watermark = 0;
    var $original_watermark = 0;
    var $image_watermark_position = 'top_left';
    var $thumb_watermark_position = 'top_left';
    var $original_watermark_position = 'top_left';

    var $u_rights = 'can_view_cat=0,18,19,20,21,23,24,25*can_view_photo=0,18,19,20,21,23,24,25*can_add_photo_single=18,19,20,21,23,24,25*can_add_photo_archive=19,20,21,23,24,25*can_edit_photo=25*can_edit_own_photo=18,19,20,21,23,24,25*can_del_photo=25*can_del_own_photo=18,19,20,21,23,24,25*can_add_cat=25*can_edit_cat=25*can_del_cat=25';

    var $_real_subgroup = null;


    function __construct(&$db, $group = 'joigallery', $subgroup = 'default') {
        
        if(is_null($db)){
            $db = database::getinstance();
        }

        $this->_real_subgroup = $subgroup;

        parent::__construct($db, $group, $this->_real_subgroup);

        if(!$this->_loaded) {
            parent::__construct($db, $group, 'default');
            $this->_subgroup = $this->_real_subgroup;
        }

        $this->allow_formats = explode(',', $this->allow_formats);
    }


    function display_config($option, $isNew = 0) {

        $mainframe = &mosMainFrame::getInstance();
        $list = array();

        if($isNew) {
            $categories = joiGalleryCategory::getCategoryTree();

            $obj = new stdClass();
            $obj->id = 'default';
            $obj->name = 'default';
            array_unshift($categories, $obj);

            $list['cid'] = mosHTML::selectList($categories, 'group', 'class="inputbox text_area"', 'id', 'name');
        }
        
        //Сортировка изображений в категории
        $list['images_sort'] = $this->get_sort_list();

        //Директория шаблонов
        $list['template_dir'] = $this->get_template_dir_list();

        //Список вариантов отображения категорий на главной
        $list['main_view_subcats'] = $this->get_main_view_subcats_list();        
        
        //Список вариантов вывода изображений на главной
        $list['main_view_items'] = $this->get_main_view_items_list();

        //Список вариантов отображения подкатегорий на странице категории
        $list['cat_view_subcats'] = $this->get_cat_view_subcats_list();

        //Список вариантов вывода изображений на странице категории
        $list['cat_view_items'] = $this->get_cat_view_items_list();
		
		//Выбор директории изображений для формирования миниатюр для списка категорий
        //в административной части
        $list['adm_cat_list_thumbs_source'] = $this->get_adm_cat_list_thumbs_source();
		
		//Выбор директории изображений для формирования миниатюр для списка изображений
        //в административной части
        $list['adm_img_list_thumbs_source'] = $this->get_adm_img_list_thumbs_source();
		
		//Выбор директории изображений для формирования миниатюр для страницы редактирования
        //изображения в административной части
        $list['adm_img_form_thumbs_source'] = $this->get_adm_img_form_thumbs_source();

        //Метод отображения оригиналов в FancyBox (по одному, по порядку, по категориям)
        $list['adm_cat_list_thumbs_fb_group'] = $this->get_adm_cat_list_thumbs_fb_group();
		
		//Метод отображения оригиналов в FancyBox (по одному, по порядку, по категориям)
        $list['adm_img_list_thumbs_fb_group'] = $this->get_adm_img_list_thumbs_fb_group();
		
        //Выбор шаблона        
        $list['tpl_main_view'] = $this->get_tpl_list('mainpage-view');//Главная страница
        $list['tpl_cat_view'] = $this->get_tpl_list('category-view');//Страница просмотра категории
        $list['tpl_cat_form'] = $this->get_tpl_list('category-form');//Страница редактирования категории
        $list['tpl_item_view'] = $this->get_tpl_list('item-view');//Страница просмотра изображения
        $list['tpl_item_form'] = $this->get_tpl_list('item-form');//Страница редактирования изображения
        $list['tpl_item_add'] = $this->get_tpl_list('item-add');//Страница загрузка изображений
		
		//Выбор стиля css        
        $list['tpl_main_view_css'] = $this->get_tpl_css_list('mainpage-view');//Главная страница
        $list['tpl_cat_view_css'] = $this->get_tpl_css_list('category-view');//Страница просмотра категории
        $list['tpl_cat_form_css'] = $this->get_tpl_css_list('category-form');//Страница редактирования категории
        $list['tpl_item_view_css'] = $this->get_tpl_css_list('item-view');//Страница просмотра изображения
        $list['tpl_item_form_css'] = $this->get_tpl_css_list('item-form');//Страница редактирования изображения
        $list['tpl_item_add_css'] = $this->get_tpl_css_list('item-add');//Страница загрузка изображений

        //Позиция водяного знака
        $list['watermak_position'] = $this->get_wmark_list();

        //Системы комментариев
        $list['comment_system'] = $this->get_comment_system_list();

        //Настройка прав пользователей
        $list['u_rights'] = $this->get_u_rights();

        include_once(_JOI_GALLERY_ADMIN_BASE.DS.'view'.DS.'config_form.php');

    }

    function save_config() {

        $this->allow_formats = implode(',', $this->allow_formats);

        if(!$this->bindConfig($_REQUEST)) {
            echo "<script> alert('".$this->_error."'); window.history.go(-1); </script>";
            exit();
        }

        $this->u_rights = joiRights::prepare_for_saving($_REQUEST['u_rights']);

        if(!$this->storeConfig()) {
            echo "<script> alert('".$this->_error."'); window.history.go(-1); </script>";
            exit();
        }
    }

    function delete_config($subgroup) {

        $database = &database::getInstance();

        $query = "DELETE FROM #__config  WHERE `group` = 'joigallery' AND `subgroup` = '".$subgroup."'";
        $database->setQuery($query);
        $database->query();
    }

    function get_configs_list() {

        $database = &database::getInstance();

        $query = 'SELECT a.subgroup FROM #__config AS a WHERE a.group = "joigallery" GROUP BY a.subgroup ';
        $database->setQuery($query);
        return  $database->loadResultArray();
    }

    function get_comment_system_list() {

        $mainframe = &mosMainFrame::getInstance();
        $arr = array();

        $arr[0] = mosHTML::makeOption(0, 'Не использовать');

        $jcomments   = JPATH_BASE.DS.'components'.DS.'com_jcomments'.DS.'jcomments.class.php';
        $joicomments = JPATH_BASE.DS.'components'.DS.'com_joicomments'.DS.'joicomments.class.php';

        if(is_file($jcomments)) {
            $arr[] = mosHTML::makeOption('jcomments', 'JComments');
        }

        if(is_file($joicomments)) {
            $arr[] = mosHTML::makeOption('joicomments', 'JoiComments');
        }

        if(count($arr) > 1) {
            return mosHTML::selectList($arr, 'comments', 'class="inputbox"', 'value', 'text', $this->comments);
        }
        else {
            return 'Система комментариев не обнаружена';
        }

    }
    
    //Список вариантов сортировки
    function get_sort_list(){

        $arr = array();
        $arr[] = mosHTML::makeOption('ordering', 'Как в админке');       
        $arr[] = mosHTML::makeOption('id DESC', 'От новых к старым');   
        $arr[] = mosHTML::makeOption('id ASC', 'От старых к новым');

        return mosHTML::selectList($arr, 'images_sort', 'class="inputbox"', 'value', 'text', $this->images_sort);   
    }
   
    //Список директорий шаблона
    function get_template_dir_list() {

        $arr = array();
        $arr[] = mosHTML::makeOption(0, _C_JOIGALLERY_CONF_TPL_DIR_SYS);
        $arr[] = mosHTML::makeOption(1, _C_JOIGALLERY_CONF_TPL_DIR_TPL);

        return mosHTML::selectList($arr, 'template_dir', 'class="inputbox"', 'value', 'text', $this->template_dir);
    }

    //Список вариантов отображения категорий на главной
    function get_main_view_subcats_list() {

        $arr = array();
        $arr[] = mosHTML::makeOption(0, _C_JOIGALLERY_CONF_CATS_PARENT);//Только верхнего уровня
        $arr[] = mosHTML::makeOption(1, _C_JOIGALLERY_CONF_CATS_ALL);//Выводить все категории
        $arr[] = mosHTML::makeOption(2, _C_JOIGALLERY_CONF_CATS_NONE);//Не отображать категории

        return mosHTML::selectList($arr, 'template_main_view_subcats', 'class="inputbox"', 'value', 'text', $this->template_main_view_subcats);
    }

    //Список вариантов вывода изображений на главной
    function get_main_view_items_list() {

        $arr = array();
        $arr[] = mosHTML::makeOption(0, _C_JOIGALLERY_CONF_ITEMS_MAINPAGE_PARENT);//Из категорий верхнего уровня
        $arr[] = mosHTML::makeOption(1, _C_JOIGALLERY_CONF_ITEMS_MAINPAGE_ALL);//Отображать из всех
        $arr[] = mosHTML::makeOption(2, _C_JOIGALLERY_CONF_ITEMS_MAINPAGE_NONE);//Не отображать

        return mosHTML::selectList($arr, 'template_main_view_items', 'class="inputbox"', 'value', 'text', $this->template_main_view_items);
    }

    //Список вариантов отображения подкатегорий на странице категории
    function get_cat_view_subcats_list() {

        $arr = array();
        $arr[] = mosHTML::makeOption(0, _C_JOIGALLERY_CONF_CATS_PARENT);//Только верхнего уровня
        $arr[] = mosHTML::makeOption(1, _C_JOIGALLERY_CONF_CATS_ALL);//Выводить все подкатегории
        $arr[] = mosHTML::makeOption(2, _C_JOIGALLERY_CONF_CATS_NONE);//Не отображать подкатегории

        return mosHTML::selectList($arr, 'cat_view_subcats', 'class="inputbox"', 'value', 'text', $this->cat_view_subcats);
    }

    //Список вариантов вывода изображений на странице категории
    function get_cat_view_items_list() {

        $arr = array();
        $arr[] = mosHTML::makeOption(0, _C_JOIGALLERY_CONF_ITEMS_CAT_PARENT);//Только из текущей категории
        $arr[] = mosHTML::makeOption(1, _C_JOIGALLERY_CONF_ITEMS_CAT_ALL);//Выводить из всех подкатегории
        $arr[] = mosHTML::makeOption(2, _C_JOIGALLERY_CONF_ITEMS_CAT_NONE);//Не отображать

        return mosHTML::selectList($arr, 'cat_view_items', 'class="inputbox"', 'value', 'text', $this->cat_view_items);
    }
	
	//Список источников для создания миниатюр в списке категорий
    function get_adm_cat_list_thumbs_source() {

        $arr = array();
        $arr[] = mosHTML::makeOption('original_path', 'оригиналов');
        $arr[] = mosHTML::makeOption('image_path', 'средних эскизов');
        $arr[] = mosHTML::makeOption('thumbnail_path', 'мини-эскизов');

        return mosHTML::selectList($arr, 'adm_cat_list_thumbs_source', 'class="inputbox"', 'value', 'text', $this->adm_cat_list_thumbs_source);
    }
	
	//Список источников для создания миниатюр в списке изображений
    function get_adm_img_list_thumbs_source() {

        $arr = array();
        $arr[] = mosHTML::makeOption('original_path', 'оригиналов');
        $arr[] = mosHTML::makeOption('image_path', 'средних эскизов');
        $arr[] = mosHTML::makeOption('thumbnail_path', 'мини-эскизов');

        return mosHTML::selectList($arr, 'adm_img_list_thumbs_source', 'class="inputbox"', 'value', 'text', $this->adm_img_list_thumbs_source);
    }
	
	//Список источников для создания миниатюр в списке изображений
    function get_adm_img_form_thumbs_source() {

        $arr = array();
        $arr[] = mosHTML::makeOption('original_path', 'оригиналов');
        $arr[] = mosHTML::makeOption('image_path', 'средних эскизов');
        $arr[] = mosHTML::makeOption('thumbnail_path', 'мини-эскизов');

        return mosHTML::selectList($arr, 'adm_img_form_thumbs_source', 'class="inputbox"', 'value', 'text', $this->adm_img_form_thumbs_source);
    }

    //Список вариантов группировки для показа FB в списке категорий
    function get_adm_cat_list_thumbs_fb_group() {

        $arr = array();
        $arr[] = mosHTML::makeOption('single', 'по одному');        
        $arr[] = mosHTML::makeOption('all', 'по порядку');

        return mosHTML::selectList($arr, 'adm_cat_list_thumbs_fb_group', 'class="inputbox"', 'value', 'text', $this->adm_cat_list_thumbs_fb_group);
    }	
	
    //Список вариантов группировки для показа FB в списке изображений
    function get_adm_img_list_thumbs_fb_group() {

        $arr = array();
        $arr[] = mosHTML::makeOption('single', 'по одному');
        $arr[] = mosHTML::makeOption('cat', 'по категориям');        
        $arr[] = mosHTML::makeOption('all', 'по порядку');

        return mosHTML::selectList($arr, 'adm_img_list_thumbs_fb_group', 'class="inputbox"', 'value', 'text', $this->adm_img_list_thumbs_fb_group);
    }

    //Список шаблонов
    function get_tpl_list($page_type) {
        
        $files_system = mosReadDirectory(_JOI_GALLERY_FRONT_BASE.DS.'view'.DS.$page_type, '\.php$');

        $options = array();
        //$options[] = mosHTML::makeOption('0', _DEFAULT);
        foreach ($files_system as $file) {
                 //$options[] = mosHTML::makeOption('[s]' . $file, '[s]' . $file);
                 $options[] = mosHTML::makeOption($file, $file);
        }

        switch ($page_type) {
          case 'mainpage-view':
                $tag_name = 'template_main';
                $selected = $this->template_main;
                break;
          case 'category-view':
                $tag_name = 'template_cat';
                $selected = $this->template_cat;
                break;
          case 'category-form':
                $tag_name = 'template_edit_cat';
                $selected = $this->template_edit_cat;
                break;
          case 'item-view':
                $tag_name = 'template_photo';
                $selected = $this->template_photo;
                break;
          case 'item-form':
                $tag_name = 'template_edit_photo';
                $selected = $this->template_edit_photo;
                break;
          case 'item-add':
                $tag_name = 'template_add_photo';
                $selected = $this->template_add_photo;
                break;
        }

        return mosHTML::selectList($options, $tag_name, 'class="inputbox"', 'value', 'text', $selected);
    }
	
	
    //Список стилей шаблонов
    function get_tpl_css_list($page_type) {
        
        $files_system = mosReadDirectory(_JOI_GALLERY_FRONT_BASE.DS.'view'.DS.'css', '\.css$');

        $options = array();
        //$options[] = mosHTML::makeOption('0', _DEFAULT);
        foreach ($files_system as $file) {
                 //$options[] = mosHTML::makeOption('[s]' . $file, '[s]' . $file);
				 if ($file == 'joigallery.css') continue;
                 $options[] = mosHTML::makeOption($file, $file);
        }

        switch ($page_type) {
          case 'mainpage-view':
                $tag_name = 'template_main_css';
                $selected = $this->template_main_css;
                break;
          case 'category-view':
                $tag_name = 'template_cat_css';
                $selected = $this->template_cat_css;
                break;
          case 'category-form':
                $tag_name = 'template_edit_cat_css';
                $selected = $this->template_edit_cat_css;
                break;
          case 'item-view':
                $tag_name = 'template_item_css';
                $selected = $this->template_item_css;
                break;
          case 'item-form':
                $tag_name = 'template_edit_item_css';
                $selected = $this->template_edit_item_css;
                break;
          case 'item-add':
                $tag_name = 'template_add_item_css';
                $selected = $this->template_add_item_css;
                break;
        }

        return mosHTML::selectList($options, $tag_name, 'class="inputbox"', 'value', 'text', $selected);
    }
	

    //Список вариантов расположения водяного знака
    function get_wmark_list(){
        $arr = array();
        $arr[] = mosHTML::makeOption('top_left', 'Верхний левый угол');       
        $arr[] = mosHTML::makeOption('top_right', 'Верхний правый угол');   
        $arr[] = mosHTML::makeOption('top_center', 'Сверху по центру'); 
        $arr[] = mosHTML::makeOption('bottom_left', 'Нижний левый угол');       
        $arr[] = mosHTML::makeOption('bottom_right', 'Нижний правый угол');   
        $arr[] = mosHTML::makeOption('bottom_center', 'Снизу по центру'); 
        $arr[] = mosHTML::makeOption('middle', 'В центре изображения');
        return $arr;   
    }

    function get_u_rights() {

        $u_rights = new joiGalleryRights($this->u_rights);
        $config_table = $u_rights->draw_config_table();
        return $config_table;
    }

}

class joiGalleryHelper {

    function _load_core_js() {
        mosMainFrame::getInstance()->addJS(Jconfig::getInstance()->config_live_site.'/components/com_joigallery/js/joigallery.js','custom');
    }

    /**
     * Echo pathway
     *
     * @param int current categoryid
     */
    function fixPathway($cid, $photo = null, $action = null) {
        global $Itemid, $option;

        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();

        if ($cid == 0) return;       
        
        $query = "SELECT * FROM #__categories WHERE section = 'com_joigallery'";
        $database->setQuery($query);
        $cats = $database->loadObjectList('id');

        $pathway = array();
        if (sizeof($cats) > 0) {
            $cat = $cats[$cid];
            while ($cat->parent_id != 0) {
                $cat = $cats[$cat->parent_id];
                $pathway[] = '<a href="'.sefRelToAbs('index.php?option='.$option.'&amp;act=categories&amp;cid='.$cat->id.'&amp;Itemid='.
                        $Itemid).'">'.$cat->name.'</a>';
            }
        }
        
        $pathway = array_reverse($pathway);
        for ($i = 0, $n = count($pathway); $i < $n; $i++) {
            $mainframe->appendPathWay($pathway[$i]);
        }
        if ( !is_null($photo) && !is_null($action) ) {
            //Категории и изображение ссылками действие текстом
            $mainframe->appendPathWay('<a href="'.sefRelToAbs('index.php?option='
                       .$option.'&amp;act=categories&amp;cid='.$cats[$cid]->id
                       .'&amp;Itemid='.$Itemid).'">'.$cats[$cid]->name.'</a>');
            $mainframe->appendPathWay('<a href="'.sefRelToAbs('index.php?option='
                       .$option.'&amp;act=photos&amp;cid='.$photo->id
                       .'&amp;Itemid='.$Itemid).'">'.$photo->name.'</a>');
            $mainframe->appendPathWay($action);
        }
        elseif (!is_null($photo)) {
            //Категории ссылками изображение текстом
            $mainframe->appendPathWay('<a href="'.sefRelToAbs('index.php?option='
                       .$option.'&amp;act=categories&amp;cid='.$cats[$cid]->id
                       .'&amp;Itemid='.$Itemid).'">'.$cats[$cid]->name.'</a>');
            $mainframe->appendPathWay($photo->name);
        }
        elseif (!is_null($action)) {
            //Категории ссылками действие текстом
            $mainframe->appendPathWay('<a href="'.sefRelToAbs('index.php?option='
                       .$option.'&amp;act=categories&amp;cid='.$cats[$cid]->id
                       .'&amp;Itemid='.$Itemid).'">'.$cats[$cid]->name.'</a>');
            $mainframe->appendPathWay($action);
        }
        else {
            if (sizeof($cats) > 0) {
                $mainframe->appendPathWay($cats[$cid]->name);
            }
        }
    }

    function clear_name($name) {

        $name = preg_replace('#\W^\.#is', '', $name);
        $name = Jstring::strtolower($name);
		$name = str_replace(' ', '_', $name);
        $name = joiGalleryHelper::translite($name);
        //$name = str_replace(' ', '', $name);

        return $name;
    }

    function translite($str) {

        static $tbl= array(
        'а'=>'a', 'б'=>'b', 'в'=>'v', 'г'=>'g', 'д'=>'d', 'е'=>'e', 'ё'=>'jo', 'ж'=>'zh', 'з'=>'z',
        'и'=>'i', 'й'=>'j', 'к'=>'k', 'л'=>'l', 'м'=>'m', 'н'=>'n', 'о'=>'o', 'п'=>'p',
        'р'=>'r', 'с'=>'s', 'т'=>'t', 'у'=>'u', 'ф'=>'f', 'ы'=>'i', 'э'=>'e', 'А'=>'A',
        'Б'=>'B', 'В'=>'V', 'Г'=>'G', 'Д'=>'D', 'Е'=>'E', 'Ё'=>'JO', 'Ж'=>'ZH', 'З'=>'Z', 'И'=>'I',
        'Й'=>'J', 'К'=>'K', 'Л'=>'L', 'М'=>'M', 'Н'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R',
        'С'=>'S', 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 'Ы'=>'I', 'Э'=>'E', 'ё'=>"yo", 'х'=>"h",
        'ц'=>"ts", 'ч'=>"ch", 'ш'=>"sh", 'щ'=>"shch", 'ъ'=>"", 'ь'=>"", 'ю'=>"ju", 'я'=>"ja",
        'Ё'=>"YO", 'Х'=>"H", 'Ц'=>"TS", 'Ч'=>"CH", 'Ш'=>"SH", 'Щ'=>"SHCH", 'Ъ'=>"", 'Ь'=>"",
        'Ю'=>"YU", 'Я'=>"YA"
        );

        return strtr($str, $tbl);
    }

    function get_cat_link($cid, $params) {
        $link = sefRelToAbs('index.php?option=' . $params->_option . '&amp;act=categories&amp;cid=' . $cid . '&amp;Itemid=' . $params->_Itemid);

        return $link;
    }

    function get_thumb($photo_path, $config, $mainframe, $cid='') {

        $img = JPATH_SITE.$config->thumbnail_path.'/'.$photo_path;
        $img_file = JPATH_BASE.$config->thumbnail_path.'/'.$photo_path;
        
        if(!is_file($img_file)) {
          $img = is_file(JPATH_BASE.$config->thumbnail_path.'/'.$cid.'/noimage.jpg')
               ? JPATH_SITE.$config->thumbnail_path.'/'.$cid.'/noimage.jpg'
               : JPATH_SITE.'/images/noimage.jpg';
        }

        return $img;
    }

    function get_my_gid() {
        global $my;

        if($my->id) {
            $database = &database::getInstance();

            $query = "SELECT gid FROM #__users WHERE id = ".(int)$my->id;
            $database->setQuery($query);

            return $database->loadResult();
        }
        else {
            return 0;
        }

    }
	
    /**
    * Возвращает HTML-код миниатюры
    * для отображения в административной части	
    *
    * @param string $thumb_source
    * @param string $path
    * @param array $params
    * @param string $type
    * @return string
    **/    
    function imgThumb ($thumb_source, $path, $params, $type) {  
      
      switch ($type) {
    	case 'cat_list':
    		$show = $params->get('adm_cat_list_thumbs');
    		$thumb_width  = $params->get('adm_cat_list_thumbs_max_width');
            $thumb_height = $params->get('adm_cat_list_thumbs_max_height');
    		break;
    	case 'item_list':
    		$show = $params->get('adm_img_list_thumbs');
    		$thumb_width  = $params->get('adm_img_list_thumbs_max_width');
            $thumb_height = $params->get('adm_img_list_thumbs_max_height');
    		break;
    	case 'item_form':
    		$show = $params->get('adm_img_form_thumbs');
    		$thumb_width  = $params->get('adm_img_form_thumbs_max_width');
            $thumb_height = $params->get('adm_img_form_thumbs_max_height');
    		break;
      }
      
      $thumb = '&nbsp;';
      if ($show) {
                       
              $url = JPATH_BASE.$thumb_source.'/'.$path;		  
             
              if(!is_file($url)) $url = JPATH_SITE.'/images/noimage.jpg';
              //$uid = uniqid("load_");
    			
              $thumb = '<div class="thumb vertical_wrapper" style="height:'.$thumb_height.'px;">
                          <div class="vertical_inner">                        
                            <img src="'.JPATH_SITE.'/components/com_joigallery/lib/thumb.php?x='
                                      .$thumb_width.'&amp;y='.$thumb_height.'&amp;f=0&amp;src='
                                      .$url.'"
                                class="thumb0" alt="" border="0" />
                          </div>
                        </div>';						
      }
          
      return  $thumb;
    }
	
	
    /**
    * Возвращает расширение файла    
    *
    * @param string $file
    * @return string
    **/	
    function get_file_extension($file) {
      return array_pop(explode('.',$file));
    }
	
	
    /**
    * Возвращает MIME-тип файла    
    *
    * @param string $value
    * @return string
    **/	
    function get_mimetype($value='') {
	
      $ct['htm'] = 'text/html';
      $ct['html'] = 'text/html';
      $ct['txt'] = 'text/plain';
      $ct['asc'] = 'text/plain';
      $ct['bmp'] = 'image/bmp';
      $ct['gif'] = 'image/gif';
      $ct['jpeg'] = 'image/jpeg';
      $ct['jpg'] = 'image/jpeg';
      $ct['jpe'] = 'image/jpeg';
      $ct['png'] = 'image/png';
      $ct['ico'] = 'image/vnd.microsoft.icon';
      $ct['mpeg'] = 'video/mpeg';
      $ct['mpg'] = 'video/mpeg';
      $ct['mpe'] = 'video/mpeg';
      $ct['qt'] = 'video/quicktime';
      $ct['mov'] = 'video/quicktime';
      $ct['avi']  = 'video/x-msvideo';
      $ct['wmv'] = 'video/x-ms-wmv';
      $ct['mp2'] = 'audio/mpeg';
      $ct['mp3'] = 'audio/mpeg';
      $ct['rm'] = 'audio/x-pn-realaudio';
      $ct['ram'] = 'audio/x-pn-realaudio';
      $ct['rpm'] = 'audio/x-pn-realaudio-plugin';
      $ct['ra'] = 'audio/x-realaudio';
      $ct['wav'] = 'audio/x-wav';
      $ct['css'] = 'text/css';
      $ct['zip'] = 'application/zip';
      $ct['pdf'] = 'application/pdf';
      $ct['doc'] = 'application/msword';
      $ct['bin'] = 'application/octet-stream';
      $ct['exe'] = 'application/octet-stream';
      $ct['class']= 'application/octet-stream';
      $ct['dll'] = 'application/octet-stream';
      $ct['xls'] = 'application/vnd.ms-excel';
      $ct['ppt'] = 'application/vnd.ms-powerpoint';
      $ct['wbxml']= 'application/vnd.wap.wbxml';
      $ct['wmlc'] = 'application/vnd.wap.wmlc';
      $ct['wmlsc']= 'application/vnd.wap.wmlscriptc';
      $ct['dvi'] = 'application/x-dvi';
      $ct['spl'] = 'application/x-futuresplash';
      $ct['gtar'] = 'application/x-gtar';
      $ct['gzip'] = 'application/x-gzip';
      $ct['js'] = 'application/x-javascript';
      $ct['swf'] = 'application/x-shockwave-flash';
      $ct['tar'] = 'application/x-tar';
      $ct['xhtml']= 'application/xhtml+xml';
      $ct['au'] = 'audio/basic';
      $ct['snd'] = 'audio/basic';
      $ct['midi'] = 'audio/midi';
      $ct['mid'] = 'audio/midi';
      $ct['m3u'] = 'audio/x-mpegurl';
      $ct['tiff'] = 'image/tiff';
      $ct['tif'] = 'image/tiff';
      $ct['rtf'] = 'text/rtf';
      $ct['wml'] = 'text/vnd.wap.wml';
      $ct['wmls'] = 'text/vnd.wap.wmlscript';
      $ct['xsl'] = 'text/xml';
      $ct['xml'] = 'text/xml';

      $extension = self::get_file_extension($value);

      if (!$type = $ct[strtolower($extension)]) $type = 'text/html';      

      return $type;
    }
	
	
	
}//class joiGalleryHelper




class processImage {

    function upload_handler($params) {

        $database = &database::getInstance();

        $group = mosGetParam($_REQUEST, 'cid', 'default');
        
        if(!$params) {
		$group = mosGetParam($_REQUEST, 'cid', 'default');
		$config = new joiGalleryConfig($database, 'joigallery', $group);
		$accsess = new joiGalleryRights($config->u_rights);
		$config->_access = $accsess;
	}
	else $config = $params;

        //Загрузка одиночного изображения
        if (!empty($_FILES['photo']['name'])) {
            return self::upload_single($config);
        }
        //Загрузка zip-архива
        elseif (!empty($_FILES['zip']['name'])) {
            return self::upload_zip_archive($config);
        }

        //Загрузка из директории
        else {
            return self::upload_directory($config);
        }
    }

    function upload_single($config) {

        global $option;

        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();

        $uploader = new joiGalleryUploader('upload_single', $config->allow_formats);
        if(!$uploader->process_upload()) {
            joiGalleryError::error($uploader->error);
        }

        $_file = new StdClass();
        $_file->filepath = $_FILES['photo']['tmp_name'];
        $_file->filename = $_FILES['photo']['name'];
        $_file->imagename = mosGetParam($_REQUEST, 'name', '');
        $_file->filetype = $_FILES['photo']['type'];
        $_file->description = mosGetParam($_REQUEST, 'description', '', _MOS_ALLOWHTML);
        $_file->cid = mosGetParam($_REQUEST, 'cid', 0);
        $_file->state = mosGetParam($_REQUEST, 'state', 0);


        self::addFile($_file, $config);

        return 1;

    }

    function upload_zip_archive($config) {

        global $option;

        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();

        $uploader = new joiGalleryUploader('upload_zip_archive', $config->allow_formats);
        if(!$uploader->process_upload()) {
            joiGalleryError::error($uploader->error);
        }

        $_file = new StdClass();
        $_file->imagename = mosGetParam($_REQUEST, 'name', '');
        $_file->description = mosGetParam($_REQUEST, 'description', '', _MOS_ALLOWHTML);
        $_file->cid = mosGetParam($_REQUEST, 'cid', 0);
        $_file->state = mosGetParam($_REQUEST, 'state', 0);
        $_file->sort = mosGetParam($_REQUEST, 'sort', 'name');		

        $files = mosReadDirectory($uploader->tmpdir, '.', false, true);
        self::sortFiles($files, $_file->sort);

        if (sizeof($files) == 0) {
            joiGalleryError::error(_C_JOIGALLERY_MSG_IMAGES_NOT_FOUND_IN_ARCHIVE);
        }

        $added_files = 0;
        for ($i = 0, $n = count($files); $i < $n; $i++) {

            $_file->filepath = str_replace("\\", '/', $files[$i]);

            if (!is_file($_file->filepath)) {
                continue;
            }

			$name = explode("/", $_file->filepath);
            $_file->filename = $name[sizeof($name) - 1];			
			
            $res = getimagesize($_file->filepath);
            $_file->filetype = $res['mime'];

            if (in_array($_file->filetype, $config->allow_formats)) {
                self::addFile($_file, $config);
                $added_files++;
            }

            unlink($_file->filepath);
        }

        rmdir($uploader->tmpdir);

        //Возвращаем количество добавленных файлов
        return $added_files;

    }

    function upload_directory($config) {
        global $option;

        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();

        $dir = mosGetParam($_REQUEST, 'dir', '');

        $uploader = new joiGalleryUploader('upload_directory', $config->allow_formats);
        if(!$uploader->process_upload($dir)) {
            joiGalleryError::error($uploader->error);
        }

        $_file = new StdClass();
        $_file->imagename = mosGetParam($_REQUEST, 'name', '');
        $_file->description = mosGetParam($_REQUEST, 'description', '', _MOS_ALLOWHTML);
        $_file->cid = mosGetParam($_REQUEST, 'cid', 0);
        $_file->state = mosGetParam($_REQUEST, 'state', 0);
        $_file->sort = mosGetParam($_REQUEST, 'sort', 'name');

        $files = mosReadDirectory($dir, '.', false, true);
        self::sortFiles($files, $_file->sort);

        //Если файлы не обнаружены перенаправляем на страницу загрузки, с текстом ошибки
        if (sizeof($files) == 0) {
            //joiGalleryError::error(sprintf(_C_JOIGALLERY_MSG_IMAGES_NOT_FOUND_IN_DIR, $dir));
            mosRedirect('index2.php?option='.$option.'&act=photos&task=new',
                         sprintf(_C_JOIGALLERY_MSG_IMAGES_NOT_FOUND_IN_DIR, $dir));
        }//if

        $added_files = 0;
        for ($i = 0, $n = count($files); $i < $n; $i++) {

            $_file->filepath = str_replace("\\", '/', $files[$i]);

            if (!is_file($_file->filepath)) {
                continue;
            }

            $name = explode("/", $_file->filepath);
            $_file->filename = $name[sizeof($name) - 1];

            copy($_file->filepath, $uploader->tmpdir . '/' . $_file->filename);

            $res = getimagesize($uploader->tmpdir . '/' . $_file->filename);
            $_file->filetype = $res['mime'];

            $_file->filepath = $uploader->tmpdir . '/' . $_file->filename;

            if (in_array($_file->filetype, $config->allow_formats)) {
                self::addFile($_file, $config);
                $added_files++;
            }

            unlink($_file->filepath);
        }//for

        rmdir($uploader->tmpdir);

        //Возвращаем количество добавленных файлов
        return $added_files;
    }

    /**
     * Перемещение фото в директорию назначения,
     * создание эскизов, сохранение записи в БД
     */
    function addFile($_file, $config) {

        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();

        //Права пользователей
	    //$access = new joiGalleryRights($config->u_rights);
	    //$config->_access = $access;

        //Очищаем название файла от всяких ненужностей
        $_file->filename = joiGalleryHelper::clear_name($_file->filename);		

        //Директория изображений
        $dir_joigallery = JPATH_BASE.'/images/joigallery';
        //Директория оригиналов
        $dir_original = JPATH_BASE.'/'.$config->original_path;
        //Директория средних эскизов
        $dir_middle = JPATH_BASE.'/'.$config->image_path;
        //Директория миниатюр
        $dir_thumb = JPATH_BASE.'/'.$config->thumbnail_path;
        //Директория водяных знаков
        $dir_watermark = JPATH_BASE.'/images/joigallery/watermark';

        //Проверяем директории
        $dirs = array($dir_joigallery, $dir_original, $dir_middle, $dir_thumb, $dir_watermark);
        foreach($dirs as $dir) {
          //Проверяем существует ли директория, если нет - создаем
          if( !is_dir($dir) ) {
              mkdir($dir, 0755);
          }
          //Проверяем права на запись директории
          elseif (!is_writable($dir)) {
              joiGalleryError::error(_C_JOIGALLERY_MSG_UPLOAD_ERR_DIR_NOT_WRITABLE.': '.$dir);
          }
          //Копируем index.html в директорию
          if (!file_exists($dir.'/index.html')) {
              copy (JPATH_BASE.'/administrator/components/com_joigallery/index.html',
                    $dir.'/index.html');
          }
        }

        $img_title = '';
        if(!empty($_file->imagename)) {
            $img_title = $_file->imagename;
        }
        else {
            $n = explode('.', $_file->filename);
            $img_title = $n[0];
        }
		
		//Если название изображения отсутствует - подставляем «Временное название»		
		$img_title = ($img_title) ? $img_title : _C_JOIGALLERY_UPLOAD_ITEM_NAME_TMP;
		
        //Грузим оригинальное изображение
        $file_options = array(
                'temp_path' => $_file->filepath,
                'target_dir_original' => $dir_original.'/'.$_file->cid,
                'target_dir_middle'   => $dir_middle.'/'.$_file->cid,
                'target_dir_thumbs'   => $dir_thumb.'/'.$_file->cid,
                'file_prefix' => time(),
                'filename' => $_file->filename,
                'name' => $img_title,
                'ordering' => '99999',
                'description' => $_file->description,
                'cid' => $_file->cid,
                'noimage_file'   => JPATH_BASE.'/images/noimage.jpg',
                'state' => $_file->state
        );
				
        $img_original = new joiGalleryImage($file_options);

        if(!$img_original->upload()) {
            joiGalleryError::error($img_original->error);
        }        
        //Водяной знак
        if($config->original_watermark){
            $stamp = new water($file_options['target_dir_original'].DS.$file_options['file_prefix'].'_'.$file_options['filename'], 
            JPATH_BASE.'/images/joigallery/watermark/big.png', $config->original_watermark_position);
            $stamp->stampPicture();            
        }

        //Создаем средний эскиз изображения
        $options_middle = array(
                'method'      => $config->image_crop,
                'output_file' => '',
                'width'       => $config->max_width, /* '50', */
                'height'      => $config->max_height,/* '70', */				
                'upscale'     => $config->upscale_middle,
				'quality'     => '70'
        );
		
        if(!$img_original->create_middle($options_middle)) {
            joiGalleryError::error($img_original->error);
        }
        //Водяной знак
        if($config->image_watermark){
            $stamp = new water($file_options['target_dir_middle'].DS.$file_options['file_prefix'].'_'.$file_options['filename'], 
            JPATH_BASE.'/images/joigallery/watermark/middle.png', $config->image_watermark_position);
            $stamp->stampPicture();            
        }

        //Создаем превью изображения
        $options_thumb = array(
                'method' => $config->thumb_crop, //0 - сохранять пропорции, 1 - точная обрезка, 2 - только обрезка, без изменения размеров
                'output_file' => '',
                'width'  => $config->thumbnail_width,
                'height' => $config->thumbnail_height,
				'quality'     => '70'
        );
        if(!$img_original->create_thumb($options_thumb)) {
            joiGalleryError::error($img_original->error);
        }
        //Водяной знак
        if($config->thumb_watermark){
            $stamp = new water($file_options['target_dir_thumbs'].DS.$file_options['file_prefix'].'_'.$file_options['filename'], 
            JPATH_BASE.'/images/joigallery/watermark/small.png', $config->thumb_watermark_position);
            $stamp->stampPicture();            
        }

        //Сохраняем запись в БД
        self::store_photo($file_options, $config);

        //Копируем index.html в директории
        $dirs = array($file_options['target_dir_original'], $file_options['target_dir_middle'], $file_options['target_dir_thumbs']);
        foreach($dirs as $dir) {
          if (!file_exists($dir.'/index.html')) {
              copy (JPATH_BASE.'/administrator/components/com_joigallery/index.html',
                    $dir.'/index.html');
          }
        }

    }

    /**
     * сохранение новой записи в БД
     */
    function store_photo($file_options = array(), $config = array()) {
        global $my;

        $database = &database::getInstance();
        $mainframe = &mosMainFrame::getInstance();

        $row = new joiGalleryPhoto($database);

        $fields_row = get_object_vars($row);
        foreach($fields_row as $key=>$v) {
            if(isset($file_options[$key])) {
                $row->$key = $file_options[$key];
            }
        }
		
        $row->path = $row->cid . '/' . $file_options['file_prefix'] . "_" . $file_options['filename'];
        $row->user_id = $my->id;
        $row->created = date('Y-m-d H:i:s');

        if (self::check_first_photo($row->cid) == 0) {
            $row->default = 1;
        }

//        if (    !$config->get('add_image_pubunpub', 1)                   //Переключатель «Опубликовано»
//           || ( !$config->_access->allow_me('set_state', $my->gid)      //Смена статуса любой публикации
//             || !$config->_access->allow_me('set_state_own', $my->gid)) //Смена статуса своей публикации
//           ) {
//
//             if($config->_access->allow_me('no_premoderate', $my->gid)) {//Публикация без премодерации
//                $row->state = 1;
//             }
//             else{
//                $row->state = 0;
//             }
//        }

        
        $row->state = $file_options['state'];

        if (!$row->check()) {
            echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
            exit();
        }
        if (!$row->store()) {
            echo "<script> alert('" . $row->getError() . "'); window.history.go(-1); </script>\n";
            exit();
        }

        $row->updateOrder('cid = ' . (int)$row->cid);		

        //Дополнительные поля
        $extra_fields = new joiExtraFields($mainframe, 'com_joigallery');
        $extra_fields->save_fields_values($row->id);

    }


    /** check if first image from this gallery **/
    function check_first_photo($cid) {

        $database = &database::getInstance();

        $query = 'SELECT COUNT(1) FROM #__joigallery WHERE cid = ' . (int)$cid;
        $database->setQuery($query);

        return $database->loadResult();
    }


    function sortFiles(&$array, $sort = 'name') {

        if ($sort == 'name') { //sort by name
            sort($array);
        }
        else
        if ($sort == 'rname') { //sort by name - reversed
            rsort($array);
        }
        else
        if ($sort == 'c_date') { //sort by date created
            $new_array = array();
            for ($i = 0, $n = count($array); $i < $n; $i++) {
                $file = $array[$i];
                $new_array[filectime($file)] = $file;
            }
            ksort($new_array);
            $array = &array_values($new_array);
        }
        else
        if ($sort == 'm_date') { //sort by date modified
            $new_array = array();
            for ($i = 0, $n = count($array); $i < $n; $i++) {
                $file = $array[$i];
                $new_array[filemtime($file)] = $file;
            }
            ksort($new_array);
            $array = &array_values($new_array);
        }
    }

}//class processImage

class joiGalleryCategory extends mosCategory {

    function get_categories($cid, $show_all=false) {
        global $my;

        $query = 'SELECT c.*, e.path AS photo_path, e.state, e.name AS photo_name
                  FROM #__categories AS c
                  LEFT JOIN #__joigallery AS e ON c.id = e.cid AND e.state = 1 AND e.default = 1
                  WHERE c.section = \'com_joigallery\' ';                  

        if (!$show_all) {//Если $show_all==true выводим все категории независимо от вложенности
            $query .= 'AND c.parent_id = '.(int)$cid.' ';
        }

        if ($my->gid != 2) {
            $query .= 'AND c.published = 1 ';
        }

        $query .= 'GROUP BY c.id ORDER BY c.ordering';

        $this->_db->setQuery($query);

        return $this->_db->loadObjectList();
    }




//тест
    /**
    * Возвращает массив вложенных категорий
    *
    * @param int $cid
    * @return string The HTML code
    */
//    function get_child_list($category_id) {
//
//      $q = "SELECT category_id, category_thumb_image, category_child_id, category_name, category_name_short, category_description FROM #__{vm}_category,#__{vm}_category_xref ";
//      $q .= "WHERE #__{vm}_category_xref.category_parent_id='$category_id' ";
//      $q .= "AND #__{vm}_category.category_id=#__{vm}_category_xref.category_child_id ";
//      $q .= "AND #__{vm}_category.vendor_id='$ps_vendor_id' ";
//      $q .= "AND #__{vm}_category.category_publish='Y' ";
//      $q .= "ORDER BY #__{vm}_category.list_order, #__{vm}_category.category_name ASC";
//      $db->setQuery($q);
//      $db->query();
//
//      while($db->next_record()) {
//            $childs[] = array (
//              'category_name' =>  $db->f("category_name"),
//              'category_name_short' =>  $db->f("category_name_short"),
//              'category_id' => $db->f("category_id"),
//              'category_thumb_image' => $db->f("category_thumb_image"),
//              'category_description' =>  $db->f("category_description"),
//              'number_of_products' => ps_product_category::products_in_category( $db->f("category_id")),
//            );
//      }
//      return $childs;
//    }


    
// тест
//    function generate_tree2($cats) {
//
//        $children = array();
//        foreach ($cats as $cat ) {
//            $pt = $cat->parent_id;
//            $list = @$children[$pt] ? $children[$pt] : array();
//            array_push( $list, $cat );
//            $children[$pt] = $list;
//        }
//
//        return $list;
//    }




    /**
    * Возвращает случайное изображение из категории
    * по ID категории
    *
    * @param int $cid
    * @return string
    **/
    function get_random_photo($cid) {
        global $my;

        $query = 'SELECT path AS random_photo_path
                  FROM #__joigallery
                  WHERE cid = '.(int)$cid.' ';

        if ($my->gid != 2) {
            $query .= 'AND state = 1 ';
        }

        $query .= 'ORDER BY RAND()';

        $this->_db->setQuery($query);

        return $this->_db->loadResult();
    }


/***************************************
*
* Возвращает ID всех родительских категорий 
* из #__categories 
*
* @return string
*
****************************************/

    function get_all_parent_cats() {       

        $database = &database::getInstance();
        
        $query = "SELECT id 
                  FROM #__categories
                  WHERE parent_id = 0 
				  AND section = 'com_joigallery'  
                  ORDER BY id";
        $database->setQuery($query);

        return $database->loadObjectList();
    }
	

/***************************************
*
* Возвращает значение указанного поля 
* эскиза категории по ID категории
*
* @param int $cid
* @param string $field, default 'title'
*
****************************************/
	
    function get_cat_default_thumb_field ($cid, $field='path') {	

        $query = 'SELECT `'.$field.'`
                  FROM  #__joigallery
                  WHERE `default` = 1 
                  AND `cid` = '.(int)$cid.' '; 

        $this->_db->setQuery($query);

        return $this->_db->loadResult();

        
    }	
	

    /**
    * Возвращает значение указанного поля ($field) из #__categories
    * по ID категории
    *
    * @param int $cid
    * @param string $field, default 'title'
    * @return string
    **/
    function get_cat_field_by_cid($cid=null , $field='title') {

        if (!$cid) return false;

        $cid = (int)$cid;

        $query = "SELECT $field
                  FROM  #__categories
                  WHERE id = $cid
                  AND section = 'com_joigallery'";

        $this->_db->setQuery($query);

        return $this->_db->loadResult();
    }


    function get_categories_count_admin($cid = 0, $search = '') {

        $where = array();
        $where[] = "section = 'com_joigallery'";

        if(!empty($search)) {
            $where[] = "c.title LIKE '%".$search."%'";
        }

        if($cid > 0) {
            $where[] = 'c.parent_id = '.$cid;
        }

        $query = "SELECT COUNT(1) FROM #__categories c ";
        if(sizeof($where) > 0) {
            $query .= "WHERE " . implode(" AND ", $where);
        }
        $query .= " ORDER BY parent_id, ordering";

        $this->_db->setQuery($query);

        return $this->_db->loadResult();

    }


/***************************************
*
* Листинг категорий в административной части
*
* @param array $cid
* @param bool $all default false
*
****************************************/

    function get_categories_admin($cid, $all = false) {

        $where = array();
        $where[] = "section = 'com_joigallery'";

//        if(!empty($search)) {
//            $where[] = "c.title LIKE '%" . $search . "%'";
//        }
		
		if ($all) { 
            $cat_ids_array = explode(',',$cid);
            if (count($cat_ids_array) > 1) { 
                $i = 1;
				$ids = '';
                foreach ($cat_ids_array as $cat_id) {
                    if ($i == count($cat_ids_array))
			            $ids .= "c.id = '".(int)$cat_id."'";
                    else
			            $ids .= "c.id = '".(int)$cat_id."' OR ";							
                    $i++;
                }                
				$where[] = "(".$ids.')';
            }            
			else $where[] = "c.id = '".(int)$cid."'";
		}//($all == true)
		else 
            if($cid > 0) {
               $where[] = 'c.parent_id = ' . $cid;
        }	

        $query = "SELECT * FROM #__categories c ";
        if(sizeof($where) > 0) {
            $query .= "WHERE " . implode(" AND ", $where);
        }
        // Неопубликованные объекты располагаем внизу списка (published DESC)
        $query .= " ORDER BY published DESC, parent_id, ordering";
        
		//echo '<pre>';print_r($query);echo '</pre>';//Проверка 
        
		$this->_db->setQuery($query);

        return $this->_db->loadObjectList();
    }

    function generate_tree($cats) {

        $children = array();
        foreach ($cats as $v ) {
            $pt = $v->parent_id;
            $list = @$children[$pt] ? $children[$pt] : array();
            array_push( $list, $v );
            $children[$pt] = $list;
        }
        $list = self::TreeRecurse( 0, '', array(), $children );

        return $list;
    }

    function TreeRecurse($id,$indent,$list,&$children,$maxlevel = 9999,$level = 0,$type = 1) {

        if(@$children[$id] && $level < $maxlevel) {
            foreach($children[$id] as $v) {
                $id = $v->id;

                if($type) {
                    //$pre = '<sup>&#9492;</sup>&nbsp;';
                    $pre = '&#9492;&nbsp;';
                    $spacer = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
                } else {
                    $pre = '- ';
                    $spacer = '&nbsp;&nbsp;';
                }

                if($v->parent_id == 0) {
                    $txt  = $v->name;//Для списка категорий используем название
                    //$txt2 = $v->title;//Для выпадающих списков - псевдоним
                } else {
                    $txt  = $pre.$v->name;
                    //$txt2 = $pre.$v->title;
                }

                $list[$id] = $v;
                $list[$id]->treename = $indent.$txt;
                //$list[$id]->listname = $indent.$txt2;
                $list[$id]->children = count(@$children[$id]);

                $list = self::TreeRecurse($id,$indent.$spacer,$list,$children,$maxlevel,$level + 1,$type);
            }
        }
        return $list;
    }


    function getCategoryTree($published_only = false) {

        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();

        $query = "SELECT * FROM #__categories WHERE section = 'com_joigallery' ";
        if ($published_only) {
            $query .= "AND published = 1";
        }
        $query .= "ORDER BY parent_id, ordering";
        $database->setQuery($query);
        $rows = $database->loadObjectList();

        $level = 0;
        $tree = array();

        //сортировка по родителю
        for ($i = 0, $n = count($rows); $i < $n; $i++) {
            $row = $rows[$i];
            $tree[$row->parent_id][] = $row;
        }

        $final = array();
        $level = 0;
        //Цикл по всем пунктам
        if (isset($tree[0])) {
            for ($i = 0, $n = count($tree[0]); $i < $n; $i++) {
                $row = $tree[0][$i];
                joiGalleryCategory::recurseCategory($tree, $final, $row, $level);
            }

        }
        return $final;

    }


    function recurseCategory($rows, &$tree, $row, $level) {

        $title = '';

        if ($level != 0) {
            for ($i = 0; $i < $level; $i++) {
                $title .= ' - - -';
            }
            //$title .= ' <sup>&#9492;</sup>';
            $title .= ' &#9492;';
        }
        $row->name = $title.' '.$row->name;

        $tree[] = $row;
        if (@sizeof($rows[$row->id])) {
            for ($i = 0, $n = count($rows[$row->id]); $i < $n; $i++) {

                $child = $rows[$row->id][$i];

                joiGalleryCategory::recurseCategory($rows, $tree, $child, $level + 1);
            }
        }
    }

}

class joiGalleryError {

    function error($msg) {        
       
        $iFilter = new InputFilter();	
	if(!empty($msg)) {
            $msg = $iFilter->process($msg);
            $mainframe = &mosMainFrame::getInstance();
            $mainframe->set_mosmsg($msg);
	}

	if(!headers_sent()) @ob_end_clean(); //очищаем буфер вывода
        echo "<script>window.history.go(-1);</script>\n";
	
	exit();

    }
}

class joiGalleryPlugins extends joiPlugins {

    function joiGalleryPlugins($mainframe) {
        $this->joiPlugins($mainframe, 'joigallery');
    }

}


//class joiGalleryTools extends joiTools {
//
//    function joiGalleryTools($mainframe) {
//        $this->joiTools($mainframe, 'joigallery');
//    }
//
//}



/***************************************
*
* Мастер эскизов
* 
****************************************/

class thumbMaster {

    function upload_handler() {

        $database = &database::getInstance();

        $group = mosGetParam($_REQUEST, 'cid', 'default');		
		$config = new joiGalleryConfig($database, 'joigallery', $group);
		$accsess = new joiGalleryRights($config->u_rights);
		$config->_access = $accsess;

		//Загрузка из директории
		return self::upload_directory($config);		
        
    }

    function upload_directory($config) {
        global $option;
        $_file = null;
        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();
		
		$cid = mosGetParam($_REQUEST, 'catid', 0);		
		$dir = JPATH_BASE.$config->original_path.'/'.$cid;
			
		
        $uploader = new joiGalleryUploader('upload_directory', $config->allow_formats);
        if(!$uploader->process_upload($dir)) {
            joiGalleryError::error($uploader->error);
        }

        $_file->cid = $cid;
        //$_file->state = mosGetParam($_REQUEST, 'state', 0);
        //$_file->sort = mosGetParam($_REQUEST, 'sort', 'name');

        $files = mosReadDirectory($dir, '.', false, true);        

        //Если файлы не обнаружены перенаправляем на страницу загрузки, с текстом ошибки
        if (sizeof($files) == 0) {            
            mosRedirect('index2.php?option='.$option.'&act=thumbs',
                         sprintf(_C_JOIGALLERY_MSG_IMAGES_NOT_FOUND_IN_DIR, $dir));
        }

        $added_files = 0;
        for ($i = 0, $n = count($files); $i < $n; $i++) {

            $_file->filepath = str_replace("\\", '/', $files[$i]);

            if (!is_file($_file->filepath)) {
                continue;
            }

            $name = explode("/", $_file->filepath);
            $_file->filename = $name[sizeof($name) - 1];

            copy($_file->filepath, $uploader->tmpdir . '/' . $_file->filename);
			
            $res = getimagesize($uploader->tmpdir . '/' . $_file->filename);
            $_file->filetype = $res['mime'];
            $_file->filepath = $uploader->tmpdir . '/' . $_file->filename;

            if (in_array($_file->filetype, $config->allow_formats)) {
                self::addFile($_file, $config);
                $added_files++;
            }

            unlink($_file->filepath);
        }

        //Удаляем временную директорию
		rmdir($uploader->tmpdir);

        //Возвращаем количество добавленных файлов
        return $added_files;
    }

    /**
     * Перемещение изображений в директории назначения,
     * создание эскизов
     */
    function addFile($_file, $config) {

        $mainframe = &mosMainFrame::getInstance();
        $database = &database::getInstance();

        //Очищаем название файла от всяких ненужностей
        $_file->filename = joiGalleryHelper::clear_name($_file->filename);		

        //Директория изображений
        $dir_joigallery = JPATH_BASE.'/images/joigallery';        
        //Директория средних эскизов
        $dir_middle = JPATH_BASE.'/'.$config->image_path;
        //Директория миниатюр
        $dir_thumb = JPATH_BASE.'/'.$config->thumbnail_path;
        //Директория водяных знаков
        $dir_watermark = JPATH_BASE.'/images/joigallery/watermark';

        //Проверяем директории
        $dirs = array($dir_joigallery, $dir_middle, $dir_thumb, $dir_watermark);
		
        foreach($dirs as $dir) {
          //Проверяем существует ли директория, если нет - создаем
          if( !is_dir($dir) ) {
              mkdir($dir, 0755);
          }
          //Проверяем права на запись директории
          elseif (!is_writable($dir)) {
              joiGalleryError::error(_C_JOIGALLERY_MSG_UPLOAD_ERR_DIR_NOT_WRITABLE.': '.$dir);
          }
          //Копируем index.html в общую директорию изображений
          if (!file_exists($dir.'/index.html')) {
              copy (JPATH_BASE.'/administrator/components/com_joigallery/index.html',
                    $dir.'/index.html');
          }
        }

        //Параметры 
        $file_options = array(
                'temp_path' => $_file->filepath,                
                'target_dir_middle'   => $dir_middle.'/'.$_file->cid,
                'target_dir_thumbs'   => $dir_thumb.'/'.$_file->cid,
                'file_prefix' => '',
                'filename' => $_file->filename,                
                'cid' => $_file->cid,
                'noimage_file' => JPATH_BASE.'/images/noimage.jpg'                
        );
				
        $img_original = new joiGalleryImage($file_options);

        //Создаем средний эскиз изображения
        $options_middle = array(
                'method'      => $config->image_crop,
                'output_file' => '',
                'width'       => $config->max_width,
                'height'      => $config->max_height,
                'upscale'     => $config->upscale_middle
        );
		
        //joiGalleryError::error($config->max_width.' x '.$config->max_height);
		
		if(!$img_original->create_middle($options_middle, false)) {
            joiGalleryError::error($img_original->error);
        }
		
        //Водяной знак
        if($config->image_watermark){
            $stamp = new water($file_options['target_dir_middle'].DS.$file_options['filename'], 
            JPATH_BASE.'/images/joigallery/watermark/middle.png', $config->image_watermark_position);
            $stamp->stampPicture();            
        }

        //Создаем превью изображения
        $options_thumb = array(
                'method' => $config->thumb_crop, //0 - сохранять пропорции, 1 - точная обрезка, 2 - только обрезка, без изменения размеров
                'output_file' => '',
                'width'  => $config->thumbnail_width,
                'height' => $config->thumbnail_height
        );
		
        if(!$img_original->create_thumb($options_thumb, false)) {
            joiGalleryError::error($img_original->error);
        }
		
        //Водяной знак
        if($config->thumb_watermark){
            $stamp = new water($file_options['target_dir_thumbs'].DS.$file_options['filename'], 
            JPATH_BASE.'/images/joigallery/watermark/small.png', $config->thumb_watermark_position);
            $stamp->stampPicture();            
        }

        //Копируем index.html в директории
        $dirs = array( $file_options['target_dir_middle'], $file_options['target_dir_thumbs']);
        foreach($dirs as $dir) {
          if (!file_exists($dir.'/index.html')) {
              copy (JPATH_BASE.'/administrator/components/com_joigallery/index.html',
                    $dir.'/index.html');
          }
        }		

    }    

	
}//class thumbMaster